#ifndef __PH_MB_MASTER_H__
#define __PH_MB_MASTER_H__

#include "cbb_ph_obj.h"
#include <stdint.h>

// MODBUS MASTER 数据结构
typedef struct MB_Master_Data{
    uint8_t u8Addr;         // 设备地址
    uint8_t u8FuncCode;     // 功能码
    uint16_t u16StartReg;   // 起始寄存器
    uint16_t u16RegCount;   // 寄存器个数
    uint16_t u16Data;       // 数据
    uint16_t* pu16Data;     // 数据指针
}MB_Master_Data_t;

// MODBUS MASTER 对象
typedef struct PH_MB_Master{
    MB_Master_Data_t stData;        // modbus 数据备份
    uint16_t* pu16HoldingRegs;      // 保持寄存器
    uint16_t* pu16InputRegs;        // 输入寄存器
    uint16_t u16HoldingRegsSize;    // 保持寄存器大小
    uint16_t u16InputRegsSize;      // 输入寄存器大小
    uint16_t u16Cache[125];         // 缓存数据
}PH_MB_Master_t;

/**
 * @brief 注册 modbus master 协议
 * @param pstSelf 协议上下文特征对象
 * @param fCheck 校验函数
 * @param fAppend 追加函数
 * @return PH_t* 协议对象
 */
PH_REG_DEC(cbb_mb_slave, PH_MB_Master_t)

/**
 * @brief 设置 modbus master 数据
 * @param pstSelf 协议上下文特征对象
 * @param pstData modbus 数据
 */
PH_RET_t
cbb_mb_set_data(PH_t* pstSelf, MB_Master_Data_t* pstData);

/**
 * @brief 构建 modbus master 构建报文
 * @param pstPHObj 协议对象
 * @param pstTxBuffer 发送缓存
 * @return @see PH_RET_t
 */
PH_RET_t 
cbb_mb_master_build(PH_t* pstPHObj, PH_Buf_t* pstTxBuffer);

/**
 * @brief 解析 modbus master 解析报文
 * @param pstPHObj 协议对象
 * @param pstRxBuffer 接收缓存
 * @return @see PH_RET_t
 */
PH_RET_t 
cbb_mb_master_parse(PH_t* pstSelf, PH_Buf_t* pstRxBuffer);

#endif /* __PH_MB_MASTER_H__ */
